上一章節講述了 PostgreSQL 的鍵置和 mybatis 連線到 DB 的配置,那今天就來實際用 mybatis 的方式來撰寫 SQL。
今天補充一下,雖然講了如何配置連線到 DB 的配置,但沒描述到其相關的環境變數設置(db_classname、db_username 等),這些環境變數配置一般來說都會在 resources 下的 application.properties 進行配置,如下
db_classname=org.postgresql.Driver
db_username=itachi
db_url=jdbc:postgresql://172.17.10.105:5432/employee
db_password=12345678
db_maximum_pool_size=3
在 mapper 目錄下定義一個 UserMapper.java 檔案,其內容會是對 DB 的相關操作定義,像是 add
方法就是用來新增一個使用者。
在 mybatis 提供@SelectProvider、@InsertProvider、@UpdateProvider、@DeleteProvider 註解來實現 CRUD。其中註解裡的 type 表示表示實現 SQL 操作的類,method 表示 type(實現 SQL 操作的類)中的對應方法。通常 Insert、Delete 和 Update 都是返回筆數所以是回傳一個 Integer 類型。
@Mapper
public interface UserMapper {
@SelectProvider(type = UserProvider.class, method = "addUser")
public UserResponseVO add(UserRequestVO user);
@DeleteProvider(type = UserProvider.class, method = "delete")
public Integer delete(@Param("id") String id);
@SelectProvider(type = UserProvider.class, method = "update")
public UserResponseVO update(UserRequestVO user);
// List<UserResponseVO> get(@Param("id") String id);
@SelectProvider(type = UserProvider.class, method = "getById")
public UserResponseVO getById(@Param("id") String id);
@SelectProvider(type = UserProvider.class, method = "isExistUser")
public Boolean isExistUser(@Param("name") String name);
}
上述定義了 CRUD 對應的 SQL 操作,接下來我們來實現其 SQL 的語法,在 provider 目錄下我們定義了 UserProvider.java 檔案,這檔案會是定義 SQL 語法的實現,RETURNING
是 PostgreSQL 的特殊用法,可以說我想要回傳那些字段,這個用法可以使用在 Insert、Update 或 Delete 上。
public class UserProvider {
private final String TABLE = "public.user"; // 對應 SQL 中的表
// 實現 Insert
public final String addUser(UserRequestVO user) {
return new SQL().INSERT_INTO(TABLE)
.VALUES("name", "#{name}")
.VALUES("age", "#{age}")
.VALUES("email", "#{email}")
.VALUES("tel", "#{tel}")
.toString() + " RETURNING * ";
}
// 實現查詢
public final String getById(@Param("id") String id) {
StringBuilder sql = new StringBuilder();
sql.append("SELECT * " +
"FROM public.user " +
"WHERE id = #{id}");
return sql.toString();
}
public final String isExistUser(@Param("name") String name) {
StringBuilder sql = new StringBuilder();
sql.append("SELECT ")
.append("EXISTS ( SELECT 1 FROM ")
.append(TABLE)
.append(" WHERE name = #{name} )");
return sql.toString();
}
// 實現 Delete
public final String delete(@Param("id") String id) {
return new SQL().DELETE_FROM(TABLE).WHERE("id = #{id}").toString();
}
// 實現 Update
public final String update(UserRequestVO user) {
SQL sql = new SQL()
.UPDATE(TABLE)
.SET("name = #{name}")
.SET("age = #{age}")
.SET("email = #{email}")
.SET("tel = #{tel}")
.WHERE("id = #{id}");
return sql.toString() + " RETURNING * ";
}
}
上述的範例都在 github 上。